#ifndef SIMS_H
#define SIMS_H

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

// 在终端不支持中文时，使用以下宏定义
#define ENGLISH

// 默认存储容量，决定数组的初始大小
#define DEFAULT_SIZE 10
// 学生信息的最大长度，在程序的后续判断中实际上只能是12位，多一位是为了放'\0'
#define MAX_ID_LENGTH 13
// 学生及管理员姓名的最大长度
#define MAX_NAME_LENGTH 21
// 管理员密码的最大长度
#define MAX_PASSWORD_LENGTH 20
// 管理员尝试登录的最大次数
#define MAX_ATTEMPT 3
// 管理员登录次数用完后，等待的时间，单位为毫秒
#define ATTEMPT_LETTER 120000

// malloc,realloc,空值检查宏及交换宏
#define MALLOC(__type__, __size__) \
    (__type__*)malloc(sizeof(__type__) * __size__)
#define REALLOC(__type__, __size__) \
    (__type__*)realloc(__type__, sizeof(__type__) * __size__)
// 值得一提的是，如果函数返回值为空，则ret不写
#define CHECK_NULL(args_may_null, err_info, ret) \
    if (!args_may_null) {                        \
        printf(err_info);                        \
        return ret;                              \
    }
#define SWAP_T(__type__, a, b) \
    __type__ temp = a;         \
    a = b;                     \
    b = temp;

typedef enum { FEMALE, MALE } Gender;

typedef struct {
    int chinese;
    int math;
    int english;
    int total;
    float average;
} Score;  // 成绩

typedef enum {
    EXIT_SYSTEM,
    ADD_STU_INFO,
    DEL_STU_INFO,
    FIND_STU_INFO,
    SHOW_STU_INFO,
    MODIFY_STU_INFO,
    SORT_STU_INFO,
}CHOICE;

typedef struct {
    char id[MAX_ID_LENGTH];
    char name[MAX_NAME_LENGTH];
    int age;
    Gender gender;
    Score score;
} Stu;  // 学生信息

typedef struct {
    char username[MAX_NAME_LENGTH];
    char password[MAX_PASSWORD_LENGTH];
} Admin;  // 管理员信息

typedef struct {
    Stu* data;
    int size;
    int capacity;
} Table;  // 学生信息数据结构

// 全局变量，管理员和学生信息
extern Admin* admin;
extern Table* table;
extern char* filename_stu_info;

// 函数声明
// 显示菜单
void menu();
// 初始化
void InitTable();
// 加载信息
void LoadInfo();
void LoadAdmin(char* fileName);
// 管理员登录
void Login();
// 增删改查
// 1. 添加
bool AddStuInfo();
// 2. 删除
bool DeleteStuInfo();
// 3. 查找
bool FindStuInfo();
// 4. 显示
void ShowStuInfo();
// 5. 修改
bool ModifyStuInfo();
// 6. 排序
// 比较函数，用于排序
int CompareByScore(Stu* a, Stu* b);
int CompareByAge(Stu* a, Stu* b);
int CompareByName(Stu* a, Stu* b);
int CompareById(Stu* a, Stu* b);
// 排序函数
void HeapSort(Stu* data, int n, int (*cmp)(Stu*, Stu*));
bool SortStuInfo();
// 7. 保存信息
bool SaveInfo();
// 释放资源
void FreeAll();

#endif // SIMS_H